#include<bits/stdc++.h>
using namespace std;
int d[100001],v[100001],a[100001],p[100001],ans,res,m;
vector<int> b[100001];
struct node{
    int pos,id;
}t[100001];
bool check(int x){
    for(int i=0;i<b[x].size();i++){
        if(p[b[x][i]]-1<=0){
            return false;
        }
    }
    return true;
}
void dfs(int dp,int sum){
    if(dp==m){
        res=max(res,sum);
        return;
    }
    if(check(dp)){
        for(int i=0;i<b[dp].size();i++){
            p[b[dp][i]]--;
        }
        dfs(dp+1,sum+1);
        for(int i=0;i<b[dp].size();i++){
            p[b[dp][i]]++;
        }
    }
    dfs(dp+1,sum);
    return;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T,n,L,V,tmp;
    bool flag;
    cin>>T;
    for(int z=1;z<=T;z++){
        cin>>n>>m>>L>>V;
        ans=0;
        res=0;
        for(int i=0;i<=100000;i++) b[i].clear();
        for(int i=1;i<=n;i++){
            cin>>d[i]>>v[i]>>a[i];
        }
        for(int i=1;i<=m;i++){
            cin>>t[i].pos;
            t[i].id=i;
        }
        for(int i=1;i<=n;i++){
            if(a[i]==0){
                if(v[i]<=V){
                    continue;
                }
                flag=false;
                for(int j=1;j<=m;j++){
                    if(t[j].pos>=tmp){
                        if(flag==false) ans++;
                        b[t[j].id].push_back(i);
                        p[i]++;
                        flag=true;
                    }
                }
            }else if(a[i]>0){
                if(v[i]>V){
                    tmp=d[i];
                }else{
                    tmp=d[i]+ceil(double((V*V-v[i]*v[i])/double(2*a[i])));
                }
                flag=false;
                for(int j=1;j<=m;j++){
                    if(t[j].pos>=tmp){
                        if(flag==false) ans++;
                        b[t[j].id].push_back(i);
                        p[i]++;
                        flag=true;
                    }
                }
            }else{
                if(v[i]<V){
                    continue;
                }
                tmp=d[i]+ceil(double((V*V-v[i]*v[i])/double(2*a[i])));
                flag=false;
                for(int j=1;j<=m;j++){
                    if(t[j].pos<=tmp&&t[j].pos>=d[i]){
                        if(flag==false) ans++;
                        b[t[j].id].push_back(i);
                        p[i]++;
                        flag=true;
                    }
                }
            }
        }
        dfs(1,0);
        cout<<ans<<" "<<res<<endl;
    }
    return 0;
}

